//package cn.pfz;
//
//
//
//import com.fasterxml.jackson.databind.ObjectMapper;
//import org.apache.commons.beanutils.BeanUtils;
//import org.elasticsearch.action.search.SearchResponse;
//import org.elasticsearch.index.query.QueryBuilders;
//import org.elasticsearch.search.SearchHit;
//import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
//import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
//import org.junit.jupiter.api.Test;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.test.context.SpringBootTest;
//import org.springframework.data.domain.Pageable;
//import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
//import org.springframework.data.elasticsearch.core.SearchResultMapper;
//import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
//import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
//import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
//
//import java.util.ArrayList;
//import java.util.List;
//
//@SpringBootTest
//public class HighLight {
//
//    @Autowired
//    private ElasticsearchTemplate template;
//    //查询标题或者简介   title   infro  并且要高亮显示    Apple iPhone XR
//    //<span style="color:red">Apple iPhone XR</span>
//
//
//    //查找高亮的信息  在规定的字段中查找
//    @Test
//    public void TestHighLigh() throws Exception {
//        //java与 json互相转换的工具对象
//        ObjectMapper mapper = new ObjectMapper();
//        NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
//        //设置好查询的索引和类型
//        builder.withIndices("es_shop").withTypes("shop_product");
//        builder.withQuery(QueryBuilders.
//                multiMatchQuery("荣耀MagicBook Pro", "title", "intro"));
//
//        //调用withHighlightFields方法来设定 title   infro 两个列中的含有关键字的高亮样式
//        //该方法就是将关键字加上特定的HTML标签。
//        builder.withHighlightFields(
//                new HighlightBuilder.Field("title")
//                        .preTags("<span style='color:red'>").postTags("</span>"),
//                new HighlightBuilder.Field("intro")
//                        .preTags("<span style='color:red'>").postTags("</span>")
//        );
//
//
//        //通过template  queryForPage方法将上面定义好的规则，进行查询并替换。
//        //要明确是在哪个实体中，和哪个索引中查询
//
//        AggregatedPage<Product> page = template.queryForPage(builder.build(), Product.class,
//                new SearchResultMapper() {
//                    @Override
//                    public <T> AggregatedPage<T> mapResults(SearchResponse response,
//                                                            Class<T> clazz, Pageable pageable) {
//                        List<T> list = new ArrayList<>();
//                        for (SearchHit hit : response.getHits().getHits()) {
//                            list.add(mapSearchHit(hit, clazz));
//                        }
//                        long total = response.getHits().totalHits;
//                        return new AggregatedPageImpl<>(list, pageable, total);
//                    }
//
//
//                    //替换需要高亮显示的字段内容，beanutils 对象来。。Apache
//                    @Override
//                    public <T> T mapSearchHit(SearchHit searchHit, Class<T> type) {
//                        T t = null;
//                        try {
//                            t = mapper.readValue(searchHit.getSourceAsString(), type);
//                            for (HighlightField field : searchHit.getHighlightFields().values()) {
//                                BeanUtils.setProperty(t, field.getName(), field.getFragments()[0].string());
//                            }
//                        } catch (Exception e) {
//                            e.printStackTrace();
//                            return null;
//                        }
//
//                        return t;
//                    }
//
//                });
//
//        page.forEach(System.err::println);
//
//    }
//}
